/**
* 说明:   微信请求校验
* @Title: SignUtil.java 
* @Package com.hutong.wechat.util 
* @author wangjun@hutong.com   
* @date 2016年7月4日 上午11:16:33
* @updateAuthor 
* @updateTime 
* @updateReason  
* @version V1.0   
*/
package com.cn.hnust.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/** 
 * 类说明:		微信请求校验工具类
 * @ClassName: SignUtil
 * @author ht_wangjun
 * @date 2016年7月4日 上午11:16:33 
 * @updateAuthor 
 * @updateTime 
 * @updateReason
 * @version V1.0 
 */
public class SignUtils {

	/** 微信验证token */
	public static final String WECHAT_TOKEN = "654531lx";//"qhhtwechat0704";
	
	/**
	* 方法说明:	验证签名
	* @Title: checkSignature
	* @param signature
	* @param timestamp
	* @param nonce
	* @return 
	* @see 传入参数
	* @see 返回参数
	* @see CodeUtil 错误码对照表
	* @author ht_wangjun
	* @date 2016年7月4日 上午11:19:18 
	* @updateAuthor 
	* @updateTime 
	* @updateReason
	 */
	public static boolean checkSignature(String signature, String timestamp, String nonce) {
		String arr[] = new String[] {WECHAT_TOKEN, timestamp, nonce};
		
		// 将token、timestamp、nonce三个参数进行字典序排序
		Arrays.sort(arr);
		StringBuffer content = new StringBuffer();
		
		for(int i = 0; i < arr.length; i++) {
			content.append(arr[i]);
		}
		
		MessageDigest md = null;  
		String tmpStr = null;
		
		try {  
			md = MessageDigest.getInstance("SHA-1");  
			// 将三个参数字符串拼接成一个字符串进行sha1加密  
			byte[] digest = md.digest(content.toString().getBytes());  
			tmpStr = byteToStr(digest);  
		} catch (NoSuchAlgorithmException e) {  
			e.printStackTrace();  
		}  
		content = null;  
		// 将sha1加密后的字符串可与signature对比，标识该请求来源于微信  
		System.out.println(tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false);
		return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
	}
	
	/**
	* 方法说明:	将字节数组转换为十六进制字符串
	* @Title: byteToStr
	* @param byteArray
	* @return 
	* @see 传入参数
	* @see 返回参数
	* @see CodeUtil 错误码对照表
	* @author ht_wangjun
	* @date 2016年7月4日 上午11:29:22 
	* @updateAuthor 
	* @updateTime 
	* @updateReason
	 */
	private static String byteToStr(byte[] byteArray) {  
		String strDigest = "";  
		for (int i = 0; i < byteArray.length; i++) {  
			strDigest += byteToHexStr(byteArray[i]);  
		}
		
		return strDigest;  
	}
	
	/**
	* 方法说明:	将字节转换为十六进制字符串
	* @Title: byteToHexStr
	* @param mByte
	* @return 
	* @see 传入参数
	* @see 返回参数
	* @see CodeUtil 错误码对照表
	* @author ht_wangjun
	* @date 2016年7月4日 上午11:29:51 
	* @updateAuthor 
	* @updateTime 
	* @updateReason
	 */
	private static String byteToHexStr(byte mByte) {  
		char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  
		char[] tempArr = new char[2];  
		tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
		tempArr[1] = Digit[mByte & 0X0F];  
		String s = new String(tempArr);  
		
		return s;  
	} 


}
